# load required libraries
library(tidyverse)
library(langcog) # source: https://github.com/langcog/langcog-package
library(psych)
library(lme4)
library(cowplot)
# set theme for ggplots
theme_set(theme_bw())
Data preparation
d_all <- d_us_ad_pilot %>% rownames_to_column("subid") %>%
full_join(d_gh_ch %>% rownames_to_column("subid")) %>%
full_join(d_th_ad %>% rownames_to_column("subid")) %>%
full_join(d_th_ch %>% rownames_to_column("subid")) %>%
full_join(d_vt_ad %>% rownames_to_column("subid")) %>%
full_join(d_vt_ch %>% rownames_to_column("subid")) %>%
column_to_rownames("subid")
Joining, by = c("subid", "get angry", "choose what to do", "figure out how to do things", "feel guilty", "feel happy", "hear things", "get hungry", "get hurt feelings", "feel love", "feel pain", "pray", "feel proud", "remember things", "feel sad", "feel scared", "sense when things are far away", "sense temperatures", "feel shy", "feel sick, like when you feel like you might vomit", "smell things", "think about things", "feel tired")
Joining, by = c("subid", "get angry", "choose what to do", "figure out how to do things", "feel guilty", "feel happy", "hear things", "get hungry", "get hurt feelings", "feel love", "feel pain", "pray", "feel proud", "remember things", "feel sad", "feel scared", "sense when things are far away", "sense temperatures", "feel shy", "feel sick, like when you feel like you might vomit", "smell things", "think about things", "feel tired")
Joining, by = c("subid", "get angry", "choose what to do", "figure out how to do things", "feel guilty", "feel happy", "hear things", "get hungry", "get hurt feelings", "feel love", "feel pain", "pray", "feel proud", "remember things", "feel sad", "feel scared", "sense when things are far away", "sense temperatures", "feel shy", "feel sick, like when you feel like you might vomit", "smell things", "think about things", "feel tired")
Joining, by = c("subid", "get angry", "choose what to do", "figure out how to do things", "feel guilty", "feel happy", "hear things", "get hungry", "get hurt feelings", "feel love", "feel pain", "pray", "feel proud", "remember things", "feel sad", "feel scared", "sense when things are far away", "sense temperatures", "feel shy", "feel sick, like when you feel like you might vomit", "smell things", "think about things", "feel tired")
Joining, by = c("subid", "get angry", "choose what to do", "figure out how to do things", "feel guilty", "feel happy", "hear things", "get hungry", "get hurt feelings", "feel love", "feel pain", "pray", "feel proud", "remember things", "feel sad", "feel scared", "sense when things are far away", "sense temperatures", "feel shy", "feel sick, like when you feel like you might vomit", "smell things", "think about things", "feel tired")
Shared conceptual structure
Pooling all participants from all sites together into a common factor structure.
Parallel analysis
How many factors to retain?
reten_all_PA <- fa.parallel(d_all, plot = F); reten_all_PA
Parallel analysis suggests that the number of factors = 4 and the number of components = 3
Call: fa.parallel(x = d_all, plot = F)
Parallel analysis suggests that the number of factors = 4 and the number of components = 3
Eigen Values of
Original factors Simulated data Original components simulated data
1 8.53 0.34 9.13 1.28
2 1.28 0.26 1.92 1.24
3 0.62 0.22 1.26 1.20
4 0.20 0.19 0.83 1.18
reten_all_par <- reten_all_PA$nfact
What are these factors?
efa_all_par <- fa(d_all, nfactors = reten_all_par, rotate = "oblimin",
scores = "tenBerge", impute = "median")
convergence not obtained in GPFoblq. 1000 iterations used.
heatmap_fun(efa_all_par) +
labs(title = "Parallel Analysis")
Joining, by = "capacity"
Joining, by = "factor"

Which capacities are attributed to which targets?
scoresplot_fun(efa_all_par, target = "all") +
labs(title = "Parallel Analysis")
|=================== | 26% ~6 s remaining
|=================== | 27% ~6 s remaining
|=================== | 27% ~6 s remaining
|==================== | 28% ~6 s remaining
|==================== | 28% ~6 s remaining
|===================== | 29% ~6 s remaining
|===================== | 30% ~6 s remaining
|====================== | 31% ~6 s remaining
|======================= | 32% ~6 s remaining
|======================= | 32% ~6 s remaining
|======================== | 33% ~6 s remaining
|======================== | 34% ~5 s remaining
|========================= | 35% ~5 s remaining
|========================= | 35% ~5 s remaining
|========================== | 36% ~5 s remaining
|=========================== | 37% ~5 s remaining
|=========================== | 38% ~5 s remaining
|============================ | 39% ~5 s remaining
|============================ | 40% ~5 s remaining
|============================= | 40% ~5 s remaining
|============================= | 41% ~5 s remaining
|============================== | 41% ~5 s remaining
|============================== | 42% ~5 s remaining
|============================== | 42% ~5 s remaining
|=============================== | 43% ~5 s remaining
|=============================== | 44% ~5 s remaining
|================================ | 44% ~5 s remaining
|================================ | 45% ~5 s remaining
|================================= | 46% ~5 s remaining
|================================= | 46% ~5 s remaining
|================================== | 48% ~5 s remaining
|=================================== | 48% ~5 s remaining
|==================================== | 50% ~5 s remaining
|==================================== | 50% ~5 s remaining
|===================================== | 51% ~4 s remaining
|====================================== | 52% ~4 s remaining
|====================================== | 52% ~4 s remaining
|====================================== | 53% ~4 s remaining
|======================================= | 54% ~4 s remaining
|======================================= | 55% ~4 s remaining
|======================================== | 55% ~4 s remaining
|========================================= | 56% ~4 s remaining
|========================================= | 57% ~4 s remaining
|========================================= | 57% ~4 s remaining
|========================================== | 58% ~4 s remaining
|=========================================== | 59% ~4 s remaining
|=========================================== | 60% ~4 s remaining
|============================================ | 61% ~4 s remaining
|============================================= | 62% ~4 s remaining
|============================================= | 62% ~4 s remaining
|============================================= | 63% ~3 s remaining
|============================================== | 63% ~3 s remaining
|=============================================== | 65% ~3 s remaining
|================================================ | 66% ~3 s remaining
|================================================ | 66% ~3 s remaining
|================================================ | 67% ~3 s remaining
|================================================ | 67% ~3 s remaining
|================================================= | 68% ~3 s remaining
|================================================= | 68% ~3 s remaining
|================================================== | 69% ~3 s remaining
|================================================== | 70% ~3 s remaining
|=================================================== | 70% ~3 s remaining
|=================================================== | 71% ~3 s remaining
|==================================================== | 72% ~3 s remaining
|==================================================== | 72% ~3 s remaining
|===================================================== | 73% ~3 s remaining
|====================================================== | 74% ~2 s remaining
|====================================================== | 75% ~2 s remaining
|======================================================= | 76% ~2 s remaining
|======================================================== | 77% ~2 s remaining
|========================================================= | 78% ~2 s remaining
|========================================================= | 79% ~2 s remaining
|========================================================= | 79% ~2 s remaining
|========================================================== | 80% ~2 s remaining
|========================================================== | 80% ~2 s remaining
|=========================================================== | 81% ~2 s remaining
|=========================================================== | 82% ~2 s remaining
|=========================================================== | 82% ~2 s remaining
|============================================================ | 83% ~2 s remaining
|============================================================= | 84% ~2 s remaining
|============================================================= | 84% ~2 s remaining
|============================================================= | 85% ~2 s remaining
|============================================================== | 85% ~2 s remaining
|============================================================== | 85% ~2 s remaining
|============================================================== | 86% ~1 s remaining
|=============================================================== | 87% ~1 s remaining
|=============================================================== | 88% ~1 s remaining
|================================================================ | 88% ~1 s remaining
|================================================================ | 88% ~1 s remaining
|================================================================ | 89% ~1 s remaining
|================================================================= | 90% ~1 s remaining
|================================================================= | 90% ~1 s remaining
|================================================================== | 90% ~1 s remaining
|================================================================== | 91% ~1 s remaining
|================================================================== | 92% ~1 s remaining
|=================================================================== | 92% ~1 s remaining
|=================================================================== | 92% ~1 s remaining
|==================================================================== | 93% ~1 s remaining
|==================================================================== | 94% ~1 s remaining
|===================================================================== | 95% ~1 s remaining
|===================================================================== | 96% ~0 s remaining
|====================================================================== | 96% ~0 s remaining
|====================================================================== | 97% ~0 s remaining
|======================================================================= | 98% ~0 s remaining
|======================================================================= | 98% ~0 s remaining
|======================================================================= | 98% ~0 s remaining
|======================================================================== | 99% ~0 s remaining
|======================================================================== |100% ~0 s remaining
|=========================================================================|100% ~0 s remaining
Ignoring unknown aesthetics: y

scoresplot_fun(efa_all_par, target = c("ghosts", "God", "children")) +
labs(title = "Parallel Analysis")
the condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be usedIgnoring unknown aesthetics: y

itemsplot_fun(efa_all_par, target = c("ghosts", "God", "children")) +
labs(title = "Parallel Analysis")
the condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be usedJoining, by = "capacity"
|================================== | 48% ~2 s remaining
|=================================== | 48% ~2 s remaining
|=================================== | 49% ~2 s remaining
|==================================== | 49% ~2 s remaining
|==================================== | 50% ~2 s remaining
|===================================== | 51% ~2 s remaining
|===================================== | 52% ~2 s remaining
|===================================== | 52% ~2 s remaining
|====================================== | 53% ~2 s remaining
|====================================== | 53% ~2 s remaining
|======================================= | 54% ~2 s remaining
|======================================== | 55% ~2 s remaining
|======================================== | 56% ~2 s remaining
|========================================= | 56% ~2 s remaining
|========================================= | 57% ~2 s remaining
|========================================== | 58% ~2 s remaining
|========================================== | 58% ~2 s remaining
|=========================================== | 59% ~2 s remaining
|=========================================== | 60% ~2 s remaining
|============================================ | 61% ~2 s remaining
|============================================ | 62% ~2 s remaining
|============================================= | 62% ~2 s remaining
|============================================= | 63% ~2 s remaining
|============================================== | 64% ~2 s remaining
|=============================================== | 65% ~2 s remaining
|================================================ | 66% ~2 s remaining
|================================================= | 67% ~2 s remaining
|================================================= | 68% ~2 s remaining
|================================================= | 68% ~2 s remaining
|================================================== | 69% ~2 s remaining
|================================================== | 70% ~2 s remaining
|=================================================== | 71% ~2 s remaining
|==================================================== | 72% ~2 s remaining
|==================================================== | 72% ~2 s remaining
|===================================================== | 73% ~2 s remaining
|====================================================== | 74% ~1 s remaining
|====================================================== | 75% ~1 s remaining
|======================================================= | 76% ~1 s remaining
|======================================================== | 78% ~1 s remaining
|========================================================= | 79% ~1 s remaining
|========================================================== | 81% ~1 s remaining
|=========================================================== | 82% ~1 s remaining
|============================================================ | 83% ~1 s remaining
|============================================================ | 83% ~1 s remaining
|============================================================= | 84% ~1 s remaining
|============================================================== | 86% ~1 s remaining
|=============================================================== | 87% ~1 s remaining
|================================================================ | 89% ~1 s remaining
|================================================================= | 90% ~1 s remaining
|================================================================== | 91% ~0 s remaining
|================================================================== | 91% ~0 s remaining
|=================================================================== | 92% ~0 s remaining
|==================================================================== | 94% ~0 s remaining
|===================================================================== | 95% ~0 s remaining
|====================================================================== | 96% ~0 s remaining
|====================================================================== | 97% ~0 s remaining
|======================================================================= | 98% ~0 s remaining
|======================================================================== | 99% ~0 s remaining
|======================================================================== | 99% ~0 s remaining
Joining, by = c("factor", "capacity", "order")

Minimizing BIC
How many factors to retain?
reten_all_BIC <- VSS(d_all, plot = F); reten_all_BIC
Very Simple Structure
Call: vss(x = x, n = n, rotate = rotate, diagonal = diagonal, fm = fm,
n.obs = n.obs, plot = plot, title = title, use = use, cor = cor)
VSS complexity 1 achieves a maximimum of 0.88 with 1 factors
VSS complexity 2 achieves a maximimum of 0.92 with 2 factors
The Velicer MAP achieves a minimum of 0.01 with 3 factors
BIC achieves a minimum of -645.05 with 3 factors
Sample Size adjusted BIC achieves a minimum of -196.92 with 5 factors
Statistics by number of factors
vss1 vss2 map dof chisq prob sqresid fit RMSEA BIC SABIC complex eChisq SRMR eCRMS eBIC
1 0.88 0.00 0.018 209 1964 1.7e-282 11.0 0.88 0.096 539 1203 1.0 2336 0.074 0.078 911
2 0.56 0.92 0.011 188 899 4.0e-93 7.5 0.92 0.065 -383 214 1.5 696 0.041 0.045 -586
3 0.43 0.82 0.011 168 501 9.0e-35 6.2 0.93 0.047 -645 -112 1.8 265 0.025 0.029 -880
4 0.43 0.81 0.014 149 383 1.5e-22 5.7 0.94 0.042 -633 -160 1.9 184 0.021 0.026 -832
5 0.40 0.73 0.018 131 280 6.9e-13 5.4 0.94 0.036 -613 -197 2.1 134 0.018 0.024 -759
6 0.40 0.73 0.023 114 227 1.6e-09 5.1 0.95 0.033 -550 -188 2.2 103 0.016 0.022 -674
7 0.40 0.68 0.027 98 182 5.7e-07 4.8 0.95 0.031 -486 -175 2.3 75 0.013 0.020 -594
8 0.37 0.60 0.033 83 134 3.3e-04 4.5 0.95 0.026 -432 -168 2.5 52 0.011 0.019 -514
reten_all_bic <- data.frame(reten_all_BIC$vss.stats %>% rownames_to_column("nfact") %>% top_n(-1, BIC))$nfact %>% as.numeric()
What are these factors?
efa_all_bic <- fa(d_all, nfactors = reten_all_bic, rotate = "oblimin",
scores = "tenBerge", impute = "median")
heatmap_fun(efa_all_bic, factor_names = c("BODILY", "COGNITIVE", "SOCIAL-EMOTIONAL")) +
# labs(title = "Minimizing BIC")
# labs(x = "Figure 1: Shared conceptual structure") +
theme(axis.title.x = element_text(hjust = 0)) +
guides(fill = guide_colorbar("factor loading", barheight = 15))
the condition has length > 1 and only the first element will be usedJoining, by = "capacity"
Joining, by = "factor"

Which capacities are attributed to which targets?
scoresplot_fun(efa_all_bic, target = "all", highlight = "supernatural",
factor_names = c("BODILY", "COGNITIVE", "SOCIAL-EMOTIONAL")) +
theme(axis.text.x = element_text(angle = 90, hjust = 1, vjust = 1,
color = c(rep("black", 8),
rep("#984ea3", 2)),
face = c(rep("plain", 8),
rep("bold", 2)))) +
scale_fill_manual(values = c("#e41a1c", "#4daf4a", "#377eb8")) #+
the condition has length > 1 and only the first element will be used
|================================================================= | 90% ~0 s remaining
|=================================================================== | 92% ~0 s remaining
|==================================================================== | 94% ~0 s remaining
|====================================================================== | 96% ~0 s remaining
|======================================================================= | 98% ~0 s remaining
|======================================================================== | 99% ~0 s remaining
Ignoring unknown aesthetics: yScale for 'fill' is already present. Adding another scale for 'fill', which will replace the
existing scale.

# labs(title = "Minimizing BIC")
# labs(title = "Figure 2: Factor scores")
scoresplot_fun(efa_all_bic, target = c("ghosts", "God", "children")) +
scale_fill_manual(values = c("#e41a1c", "#4daf4a", "#377eb8")) +
labs(title = "Minimizing BIC")
the condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be usedIgnoring unknown aesthetics: yScale for 'fill' is already present. Adding another scale for 'fill', which will replace the
existing scale.

itemsplot_fun(efa_all_bic, target = c("ghosts", "God", "children")) +
labs(title = "Minimizing BIC")
the condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be usedJoining, by = "capacity"
|========================================== | 59% ~1 s remaining
|=========================================== | 60% ~1 s remaining
|============================================ | 61% ~1 s remaining
|============================================= | 63% ~1 s remaining
|=============================================== | 65% ~1 s remaining
|================================================ | 67% ~1 s remaining
|================================================= | 68% ~1 s remaining
|================================================== | 69% ~1 s remaining
|=================================================== | 71% ~1 s remaining
|==================================================== | 72% ~1 s remaining
|====================================================== | 74% ~1 s remaining
|======================================================= | 76% ~1 s remaining
|======================================================== | 77% ~1 s remaining
|========================================================= | 79% ~1 s remaining
|========================================================== | 80% ~1 s remaining
|=========================================================== | 82% ~1 s remaining
|============================================================= | 84% ~1 s remaining
|============================================================= | 84% ~1 s remaining
|============================================================== | 86% ~0 s remaining
|================================================================ | 88% ~0 s remaining
|================================================================= | 89% ~0 s remaining
|================================================================== | 91% ~0 s remaining
|=================================================================== | 92% ~0 s remaining
|==================================================================== | 94% ~0 s remaining
|===================================================================== | 95% ~0 s remaining
|======================================================================= | 97% ~0 s remaining
|======================================================================== | 99% ~0 s remaining
|=========================================================================|100% ~0 s remaining
Joining, by = c("factor", "capacity", "order")

Preset criteria
How many factors to retain?
reten_all_k <- reten_fun(d_all, rot_type = "oblimin"); reten_all_k
[1] 2
What are these factors?
efa_all_k <- fa(d_all, nfactors = reten_all_k, rotate = "oblimin",
scores = "tenBerge", impute = "median")
heatmap_fun(efa_all_k) +
labs(title = "Preset criteria (Weisman et al., 2017)")
Joining, by = "capacity"
Joining, by = "factor"

Which capacities are attributed to which targets?
scoresplot_fun(efa_all_k, target = "all") +
labs(title = "Preset criteria (Weisman et al., 2017)")
Ignoring unknown aesthetics: y

scoresplot_fun(efa_all_k, target = c("ghosts", "God", "children")) +
labs(title = "Preset criteria (Weisman et al., 2017)")
the condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be usedIgnoring unknown aesthetics: y

itemsplot_fun(efa_all_k, target = c("ghosts", "God", "children")) +
labs(title = "Preset criteria (Weisman et al., 2017)")
the condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be usedJoining, by = "capacity"
|============================= | 40% ~3 s remaining
|============================== | 42% ~3 s remaining
|================================ | 44% ~3 s remaining
|================================= | 46% ~3 s remaining
|================================== | 47% ~3 s remaining
|=================================== | 49% ~2 s remaining
|==================================== | 51% ~2 s remaining
|===================================== | 52% ~2 s remaining
|======================================= | 54% ~2 s remaining
|======================================== | 55% ~2 s remaining
|========================================= | 57% ~2 s remaining
|========================================== | 59% ~2 s remaining
|============================================ | 60% ~2 s remaining
|============================================= | 62% ~2 s remaining
|============================================== | 63% ~2 s remaining
|=============================================== | 65% ~2 s remaining
|================================================ | 67% ~1 s remaining
|================================================= | 68% ~1 s remaining
|=================================================== | 70% ~1 s remaining
|==================================================== | 72% ~1 s remaining
|===================================================== | 73% ~1 s remaining
|====================================================== | 75% ~1 s remaining
|======================================================== | 77% ~1 s remaining
|========================================================= | 79% ~1 s remaining
|========================================================== | 80% ~1 s remaining
|=========================================================== | 82% ~1 s remaining
|============================================================= | 84% ~1 s remaining
|============================================================== | 86% ~1 s remaining
|=============================================================== | 87% ~1 s remaining
|================================================================= | 89% ~0 s remaining
|================================================================== | 91% ~0 s remaining
|=================================================================== | 92% ~0 s remaining
|==================================================================== | 94% ~0 s remaining
|====================================================================== | 96% ~0 s remaining
|======================================================================= | 98% ~0 s remaining
|======================================================================== | 99% ~0 s remaining
Joining, by = c("factor", "capacity", "order")

Comparing conceptual structures
We’ll extract 4 factors from all samples, to keep things simple.
efa_us_ad_4 <- fa(d_us_ad_pilot, nfactors = 4, rotate = "oblimin")
efa_gh_ch_4 <- fa(d_gh_ch, nfactors = 4, rotate = "oblimin")
efa_th_ad_4 <- fa(d_th_ad, nfactors = 4, rotate = "oblimin")
efa_th_ch_4 <- fa(d_th_ch, nfactors = 4, rotate = "oblimin")
efa_vt_ad_4 <- fa(d_vt_ad, nfactors = 4, rotate = "oblimin")
efa_vt_ch_4 <- fa(d_vt_ch, nfactors = 4, rotate = "oblimin")
plot_us_ad_4 <- heatmap_fun(efa_us_ad_4) +
guides(fill = "none") +
labs(x = "US: adults") +
theme(axis.title.x = element_text(hjust = 0))
Joining, by = "capacity"
Joining, by = "factor"
plot_gh_ch_4 <- heatmap_fun(efa_gh_ch_4) +
guides(fill = "none") +
labs(x = "Ghana: children") +
theme(axis.title.x = element_text(hjust = 0))
Joining, by = "capacity"
Joining, by = "factor"
plot_th_ad_4 <- heatmap_fun(efa_th_ad_4) +
guides(fill = "none") +
labs(x = "Thailand: adults") +
theme(axis.title.x = element_text(hjust = 0))
Joining, by = "capacity"
Joining, by = "factor"
plot_th_ch_4 <- heatmap_fun(efa_th_ch_4) +
guides(fill = "none") +
labs(x = "Thailand: children") +
theme(axis.title.x = element_text(hjust = 0))
Joining, by = "capacity"
Joining, by = "factor"
plot_vt_ad_4 <- heatmap_fun(efa_vt_ad_4) +
guides(fill = "none") +
labs(x = "Vanuatu: adults") +
theme(axis.title.x = element_text(hjust = 0))
Joining, by = "capacity"
Joining, by = "factor"
plot_vt_ch_4 <- heatmap_fun(efa_vt_ch_4) +
guides(fill = "none") +
labs(x = "Vanuatu: children") +
theme(axis.title.x = element_text(hjust = 0))
Joining, by = "capacity"
Joining, by = "factor"
plot_grid(plot_us_ad_4, plot_gh_ch_4, plot_th_ad_4,
plot_th_ch_4, plot_vt_ad_4, plot_vt_ch_4,
ncol = 2, labels = c("A", "B", "C", "D", "E", "F"))

LS0tCnRpdGxlOiAiU1JDRCAyMDE5IFN5bXBvc2l1bTogUmVsaWdpb3VzICYgbWV0YXBoeXNpY2FsIGNvbmNlcHRzIChTcmluaXZhc2FuKSIKb3V0cHV0OiAKICBodG1sX25vdGVib29rOgogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6IHRydWUKLS0tCgpgYGB7ciBnbG9iYWxfb3B0aW9ucywgaW5jbHVkZSA9IEZ9CmtuaXRyOjpvcHRzX2NodW5rJHNldChmaWcud2lkdGggPSAzLCBmaWcuYXNwID0gMC42NykKYGBgCgpgYGB7cn0KIyBsb2FkIHJlcXVpcmVkIGxpYnJhcmllcwpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShsYW5nY29nKSAjIHNvdXJjZTogaHR0cHM6Ly9naXRodWIuY29tL2xhbmdjb2cvbGFuZ2NvZy1wYWNrYWdlCmxpYnJhcnkocHN5Y2gpCmxpYnJhcnkobG1lNCkKbGlicmFyeShjb3dwbG90KQoKIyBzZXQgdGhlbWUgZm9yIGdncGxvdHMKdGhlbWVfc2V0KHRoZW1lX2J3KCkpCmBgYAoKYGBge3IsIGluY2x1ZGUgPSBGfQpzb3VyY2UoIi4vc2NyaXB0cy9tYXhfZmFjdG9yc19lZmEuUiIpCnNvdXJjZSgiLi9zY3JpcHRzL3Bsb3RfZnVuX2JlZXRsZXMuUiIpCnNvdXJjZSgiLi9zY3JpcHRzL3JldGVuX2Z1bi5SIikKc291cmNlKCIuL3NjcmlwdHMvY2xlYW5fZnVuLlIiKQpgYGAKCiMgRGF0YSBwcmVwYXJhdGlvbgoKYGBge3IsIGluY2x1ZGUgPSBGfQpxdWVzdGlvbl9rZXkgPC0gcmVhZC5jc3YoIi9Vc2Vycy9rd2Vpc21hbi9Eb2N1bWVudHMvUmVzZWFyY2ggKFN0YW5mb3JkKS9Qcm9qZWN0cy9UZW1wbGV0b24gR3JhbnQvREVWRUxPUE1FTlRBTCBUQVNLUy9iZWV0bGVzOmRpbWtpZDpmYWN0b3JzL2Rlc2lnbi9iZWV0bGVzIGNiLmNzdiIpCmBgYAoKYGBge3IsIGluY2x1ZGUgPSBGLCB3YXJuaW5nID0gRkFMU0V9CiMgVVMgYWR1bHRzIFBJTE9UCmRfdXNfYWRfcGlsb3RfcmF3IDwtIHJlYWQuY3N2KCIvVXNlcnMva3dlaXNtYW4vRG9jdW1lbnRzL1Jlc2VhcmNoIChTdGFuZm9yZCkvUHJvamVjdHMvVGVtcGxldG9uIEdyYW50L0RFVkVMT1BNRU5UQUwgVEFTS1MvYmVldGxlczpkaW1raWQ6ZmFjdG9ycy9hbmFseXNpcy9fVVMgcGlsb3QvYmVldGxlc19waWxvdDJfdGlkeS5jc3YiKQpkX3VzX2FkX3BpbG90IDwtIGRfdXNfYWRfcGlsb3RfcmF3ICU+JQogIGZpbHRlcihzY2FsZSA9PSAiYmVldGxlcyIpICU+JQogIGRpc3RpbmN0KHN1YmlkLCBjaGFyYWN0ZXIsIHF1ZXN0aW9uLCByZXNwb25zZSkgJT4lCiAgZmlsdGVyKCFxdWVzdGlvbiAlaW4lIGMoImJsZWVkIiwgIm1pbmQiLCAic291bCIpKSAlPiUKICBtdXRhdGUocXVlc3Rpb24gPSByZWNvZGUocXVlc3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZGRfc3VidHJhY3QiID0gImFkZCBhbmQgc3VidHJhY3QgbnVtYmVycyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbmdyeSIgPSAiZ2V0IGFuZ3J5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAiYmxlZWQiID0gImJsZWVkIHdoZW4gdGhleSB0b3VjaCBzb21ldGhpbmcgc2hhcnAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiY2hvb3NlIiA9ICJjaG9vc2Ugd2hhdCB0byBkbyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJmaWd1cmVfb3V0IiA9ICJmaWd1cmUgb3V0IGhvdyB0byBkbyB0aGluZ3MiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiZ3VpbHR5IiA9ICJmZWVsIGd1aWx0eSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJoYXBweSIgPSAiZmVlbCBoYXBweSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJoZWFyIiA9ICJoZWFyIHRoaW5ncyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJodW5ncnkiID0gImdldCBodW5ncnkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiaHVydF9mZWVsaW5ncyIgPSAiZ2V0IGh1cnQgZmVlbGluZ3MiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAibG92ZSIgPSAiZmVlbCBsb3ZlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAibWluZCIgPSAiaGF2ZSBtaW5kcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYWluIiA9ICJmZWVsIHBhaW4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAicHJheSIgPSAicHJheSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAicHJvdWQiID0gImZlZWwgcHJvdWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAicmVtZW1iZXIiID0gInJlbWVtYmVyIHRoaW5ncyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJzYWQiID0gImZlZWwgc2FkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgInNjYXJlZCIgPSAiZmVlbCBzY2FyZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAic2Vuc2VfZmFyIiA9ICJzZW5zZSB3aGVuIHRoaW5ncyBhcmUgZmFyIGF3YXkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAic2Vuc2VfdGVtcCIgPSAic2Vuc2UgdGVtcGVyYXR1cmVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgInNoeSIgPSAiZmVlbCBzaHkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAic2ljayIgPSAiZmVlbCBzaWNrLCBsaWtlIHdoZW4geW91IGZlZWwgbGlrZSB5b3UgbWlnaHQgdm9taXQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAic21lbGwiID0gInNtZWxsIHRoaW5ncyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICMgInNvdWwiID0gImhhdmUgc291bHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpbmsiID0gInRoaW5rIGFib3V0IHRoaW5ncyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aXJlZCIgPSAiZmVlbCB0aXJlZCIpKSAlPiUKICBzcHJlYWQocXVlc3Rpb24sIHJlc3BvbnNlKSAlPiUKICBzZWxlY3QoLXN1YmlkKSAlPiUKICBtdXRhdGUoc3ViaWQgPSBwYXN0ZSgidXNfYWQiLAogICAgICAgICAgICAgICAgICAgICAgIDEwMDAxOigxMDAwMCtsZW5ndGgobGV2ZWxzKGZhY3RvcihkX3VzX2FkX3BpbG90X3JhdyRzdWJpZCkpKSksCiAgICAgICAgICAgICAgICAgICAgICAgInRhcmdldCIsCiAgICAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyLAogICAgICAgICAgICAgICAgICAgICAgIHNlcCA9ICJfIikpICU+JQogIGNvbHVtbl90b19yb3duYW1lcygic3ViaWQiKSAlPiUKICBzZWxlY3QoLWBhZGQgYW5kIHN1YnRyYWN0IG51bWJlcnNgLCAtY2hhcmFjdGVyKQpgYGAKCmBgYHtyLCBpbmNsdWRlID0gRiwgd2FybmluZyA9IEZBTFNFfQojIyBVUyBhZHVsdHM6IE5PVCBZRVQgUlVOCiMjIFVTIGNoaWxkcmVuOiBOT1QgWUVUIFJVTgoKIyMgR0ggYWR1bHRzOiBOT1QgWUVUIFJVTgojIyBHSCBjaGlsZHJlbgpkX2doX2NoIDwtIHJlYWQuY3N2KCIvVXNlcnMva3dlaXNtYW4vRGVza3RvcC9URU1QL1RFTVBfR0hBTkEvYmVldGxlc19naGFuYV90aWR5XzIwMTctMDctMTIuY3N2IikgJT4lIGNsZWFuX2Z1bihrZXkgPSBxdWVzdGlvbl9rZXksIGV4X2FkZHN1YiA9IFQsIHNpdGUgPSAiZ2giLCBhZ2UgPSAiY2giKQoKZF9naF9jaF9mYW50ZSA8LSByZWFkLmNzdigiL1VzZXJzL2t3ZWlzbWFuL0Rlc2t0b3AvVEVNUC9URU1QX0dIQU5BXzIwMTgvYmVldGxlc19naGFuYV9mYW50ZV9jaGlsZHJlbl90aWR5XzIwMTgtMDctMTkuY3N2IilbLTFdICU+JSAKICByZW5hbWUoc3VibnVtID0gc3ViaWQpICU+JSAKICBmaWx0ZXIoZ3JlcGwoImZhbnRlIiwgdG9sb3dlcihsYW5ndWFnZV9ob21lKSkgfCBncmVwbCgidHdpIiwgdG9sb3dlcihsYW5ndWFnZV9ob21lKSkpICU+JQogIGNsZWFuX2Z1bihrZXkgPSBxdWVzdGlvbl9rZXksIGV4X2FkZHN1YiA9IFQsIHNpdGUgPSAiZ2giLCBhZ2UgPSAiY2giKQoKIyMgQ0ggYWR1bHRzOiBOT1QgWUVUIFJVTgojIyBDSCBjaGlsZHJlbjogTk9UIFlFVCBSVU4KCiMjIFRIIGFkdWx0cwpkX3RoX2FkIDwtIHJlYWQuY3N2KCIvVXNlcnMva3dlaXNtYW4vRGVza3RvcC9URU1QL1RFTVBfVEhBSUxBTkQvYmVldGxlc190aGFpbGFuZF9hZHVsdHNfdGlkeV8yMDE4LTA1LTA5LmNzdiIpICU+JSBjbGVhbl9mdW4oa2V5ID0gcXVlc3Rpb25fa2V5LCBleF9hZGRzdWIgPSBULCBzaXRlID0gInRoIiwgYWdlID0gImFkIikKIyMgVEggY2hpbGRyZW4KZF90aF9jaCA8LSByZWFkLmNzdigiL1VzZXJzL2t3ZWlzbWFuL0Rlc2t0b3AvVEVNUC9URU1QX1RIQUlMQU5EL2JlZXRsZXNfdGhhaWxhbmRfY2hpbGRyZW5fdGlkeV8yMDE4LTA1LTA5LmNzdiIpICU+JSBjbGVhbl9mdW4oa2V5ID0gcXVlc3Rpb25fa2V5LCBleF9hZGRzdWIgPSBULCBzaXRlID0gInRoIiwgYWdlID0gImNoIikKCiMjIFZUIGFkdWx0cwpkX3Z0X2FkIDwtIHJlYWQuY3N2KCIvVXNlcnMva3dlaXNtYW4vRGVza3RvcC9URU1QL1RFTVBfVkFOVUFUVS9iZWV0bGVzX3ZhbnVhdHVfYWR1bHRzX3RpZHlfMjAxOC0wNS0wOS5jc3YiKSAlPiUgY2xlYW5fZnVuKGtleSA9IHF1ZXN0aW9uX2tleSwgZXhfYWRkc3ViID0gVCwgc2l0ZSA9ICJ2dCIsIGFnZSA9ICJhZCIpCiMjIFZUIGNoaWxkcmVuCmRfdnRfY2ggPC0gcmVhZC5jc3YoIi9Vc2Vycy9rd2Vpc21hbi9EZXNrdG9wL1RFTVAvVEVNUF9WQU5VQVRVL2JlZXRsZXNfdmFudWF0dV9jaGlsZHJlbl90aWR5XzIwMTgtMDUtMDkuY3N2IikgJT4lIGNsZWFuX2Z1bihrZXkgPSBxdWVzdGlvbl9rZXksIGV4X2FkZHN1YiA9IFQsIHNpdGUgPSAidnQiLCBhZ2UgPSAiY2giKQpgYGAKCmBgYHtyfQpkX2FsbCA8LSBkX3VzX2FkX3BpbG90ICU+JSByb3duYW1lc190b19jb2x1bW4oInN1YmlkIikgJT4lCiAgZnVsbF9qb2luKGRfZ2hfY2ggJT4lIHJvd25hbWVzX3RvX2NvbHVtbigic3ViaWQiKSkgJT4lCiAgZnVsbF9qb2luKGRfdGhfYWQgJT4lIHJvd25hbWVzX3RvX2NvbHVtbigic3ViaWQiKSkgJT4lCiAgZnVsbF9qb2luKGRfdGhfY2ggJT4lIHJvd25hbWVzX3RvX2NvbHVtbigic3ViaWQiKSkgJT4lCiAgZnVsbF9qb2luKGRfdnRfYWQgJT4lIHJvd25hbWVzX3RvX2NvbHVtbigic3ViaWQiKSkgJT4lCiAgZnVsbF9qb2luKGRfdnRfY2ggJT4lIHJvd25hbWVzX3RvX2NvbHVtbigic3ViaWQiKSkgJT4lCiAgY29sdW1uX3RvX3Jvd25hbWVzKCJzdWJpZCIpCmBgYAoKIyBTaGFyZWQgY29uY2VwdHVhbCBzdHJ1Y3R1cmUKClBvb2xpbmcgYWxsIHBhcnRpY2lwYW50cyBmcm9tIGFsbCBzaXRlcyB0b2dldGhlciBpbnRvIGEgY29tbW9uIGZhY3RvciBzdHJ1Y3R1cmUuCgojIyBQYXJhbGxlbCBhbmFseXNpcwoKIyMjIEhvdyBtYW55IGZhY3RvcnMgdG8gcmV0YWluPwoKYGBge3J9CnJldGVuX2FsbF9QQSA8LSBmYS5wYXJhbGxlbChkX2FsbCwgcGxvdCA9IEYpOyByZXRlbl9hbGxfUEEKcmV0ZW5fYWxsX3BhciA8LSByZXRlbl9hbGxfUEEkbmZhY3QKYGBgCgojIyMgV2hhdCBhcmUgdGhlc2UgZmFjdG9ycz8KCmBgYHtyfQplZmFfYWxsX3BhciA8LSBmYShkX2FsbCwgbmZhY3RvcnMgPSByZXRlbl9hbGxfcGFyLCByb3RhdGUgPSAib2JsaW1pbiIsCiAgICAgICAgICAgICAgICAgIHNjb3JlcyA9ICJ0ZW5CZXJnZSIsIGltcHV0ZSA9ICJtZWRpYW4iKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSAzLCBmaWcuYXNwID0gMn0KaGVhdG1hcF9mdW4oZWZhX2FsbF9wYXIpICsgCiAgbGFicyh0aXRsZSA9ICJQYXJhbGxlbCBBbmFseXNpcyIpCmBgYAoKIyMjIFdoaWNoIGNhcGFjaXRpZXMgYXJlIGF0dHJpYnV0ZWQgdG8gd2hpY2ggdGFyZ2V0cz8KCmBgYHtyLCBmaWcud2lkdGggPSA2LCBmaWcuYXNwID0gMC44fQpzY29yZXNwbG90X2Z1bihlZmFfYWxsX3BhciwgdGFyZ2V0ID0gImFsbCIpICsgCiAgbGFicyh0aXRsZSA9ICJQYXJhbGxlbCBBbmFseXNpcyIpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDMsIGZpZy5hc3AgPSAxLjV9CnNjb3Jlc3Bsb3RfZnVuKGVmYV9hbGxfcGFyLCB0YXJnZXQgPSBjKCJnaG9zdHMiLCAiR29kIiwgImNoaWxkcmVuIikpICsgCiAgbGFicyh0aXRsZSA9ICJQYXJhbGxlbCBBbmFseXNpcyIpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDUsIGZpZy5hc3AgPSAxfQppdGVtc3Bsb3RfZnVuKGVmYV9hbGxfcGFyLCB0YXJnZXQgPSBjKCJnaG9zdHMiLCAiR29kIiwgImNoaWxkcmVuIikpICsgCiAgbGFicyh0aXRsZSA9ICJQYXJhbGxlbCBBbmFseXNpcyIpCmBgYAoKCiMjIE1pbmltaXppbmcgQklDCgojIyMgSG93IG1hbnkgZmFjdG9ycyB0byByZXRhaW4/CgpgYGB7cn0KcmV0ZW5fYWxsX0JJQyA8LSBWU1MoZF9hbGwsIHBsb3QgPSBGKTsgcmV0ZW5fYWxsX0JJQwpyZXRlbl9hbGxfYmljIDwtIGRhdGEuZnJhbWUocmV0ZW5fYWxsX0JJQyR2c3Muc3RhdHMgJT4lIHJvd25hbWVzX3RvX2NvbHVtbigibmZhY3QiKSAlPiUgdG9wX24oLTEsIEJJQykpJG5mYWN0ICU+JSBhcy5udW1lcmljKCkKYGBgCgojIyMgV2hhdCBhcmUgdGhlc2UgZmFjdG9ycz8KCmBgYHtyfQplZmFfYWxsX2JpYyA8LSBmYShkX2FsbCwgbmZhY3RvcnMgPSByZXRlbl9hbGxfYmljLCByb3RhdGUgPSAib2JsaW1pbiIsCiAgICAgICAgICAgICAgICAgIHNjb3JlcyA9ICJ0ZW5CZXJnZSIsIGltcHV0ZSA9ICJtZWRpYW4iKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA0fQpoZWF0bWFwX2Z1bihlZmFfYWxsX2JpYywgZmFjdG9yX25hbWVzID0gYygiQk9ESUxZIiwgIkNPR05JVElWRSIsICJTT0NJQUwtRU1PVElPTkFMIikpICsgCiAgIyBsYWJzKHRpdGxlID0gIk1pbmltaXppbmcgQklDIikKICAjIGxhYnMoeCA9ICJGaWd1cmUgMTogU2hhcmVkIGNvbmNlcHR1YWwgc3RydWN0dXJlIikgKwogIHRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDApKSArCiAgZ3VpZGVzKGZpbGwgPSBndWlkZV9jb2xvcmJhcigiZmFjdG9yIGxvYWRpbmciLCBiYXJoZWlnaHQgPSAxNSkpCmBgYAoKIyMjIFdoaWNoIGNhcGFjaXRpZXMgYXJlIGF0dHJpYnV0ZWQgdG8gd2hpY2ggdGFyZ2V0cz8KCmBgYHtyLCBmaWcud2lkdGggPSA0LCBmaWcuYXNwID0gMC44fQpzY29yZXNwbG90X2Z1bihlZmFfYWxsX2JpYywgdGFyZ2V0ID0gImFsbCIsIGhpZ2hsaWdodCA9ICJzdXBlcm5hdHVyYWwiLAogICAgICAgICAgICAgICBmYWN0b3JfbmFtZXMgPSBjKCJCT0RJTFkiLCAiQ09HTklUSVZFIiwgIlNPQ0lBTC1FTU9USU9OQUwiKSkgKyAKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEsIHZqdXN0ID0gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvciA9IGMocmVwKCJibGFjayIsIDgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXAoIiM5ODRlYTMiLCAyKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZSA9IGMocmVwKCJwbGFpbiIsIDgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcCgiYm9sZCIsIDIpKSkpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCIjZTQxYTFjIiwgIiM0ZGFmNGEiLCAiIzM3N2ViOCIpKSAjKwogICMgbGFicyh0aXRsZSA9ICJNaW5pbWl6aW5nIEJJQyIpCiAgIyBsYWJzKHRpdGxlID0gIkZpZ3VyZSAyOiBGYWN0b3Igc2NvcmVzIikKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gMy41LCBmaWcuYXNwID0gMX0Kc2NvcmVzcGxvdF9mdW4oZWZhX2FsbF9iaWMsIHRhcmdldCA9IGMoImdob3N0cyIsICJHb2QiLCAiY2hpbGRyZW4iKSkgKyAKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCIjZTQxYTFjIiwgIiM0ZGFmNGEiLCAiIzM3N2ViOCIpKSArCiAgbGFicyh0aXRsZSA9ICJNaW5pbWl6aW5nIEJJQyIpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDUsIGZpZy5hc3AgPSAxfQppdGVtc3Bsb3RfZnVuKGVmYV9hbGxfYmljLCB0YXJnZXQgPSBjKCJnaG9zdHMiLCAiR29kIiwgImNoaWxkcmVuIikpICsgCiAgbGFicyh0aXRsZSA9ICJNaW5pbWl6aW5nIEJJQyIpCmBgYAoKCgojIyBQcmVzZXQgY3JpdGVyaWEKCiMjIyBIb3cgbWFueSBmYWN0b3JzIHRvIHJldGFpbj8KCmBgYHtyfQpyZXRlbl9hbGxfayA8LSByZXRlbl9mdW4oZF9hbGwsIHJvdF90eXBlID0gIm9ibGltaW4iKTsgcmV0ZW5fYWxsX2sKYGBgCgojIyMgV2hhdCBhcmUgdGhlc2UgZmFjdG9ycz8KCmBgYHtyfQplZmFfYWxsX2sgPC0gZmEoZF9hbGwsIG5mYWN0b3JzID0gcmV0ZW5fYWxsX2ssIHJvdGF0ZSA9ICJvYmxpbWluIiwKICAgICAgICAgICAgICAgICAgc2NvcmVzID0gInRlbkJlcmdlIiwgaW1wdXRlID0gIm1lZGlhbiIpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDMsIGZpZy5hc3AgPSAyfQpoZWF0bWFwX2Z1bihlZmFfYWxsX2spICsgCiAgbGFicyh0aXRsZSA9ICJQcmVzZXQgY3JpdGVyaWEgKFdlaXNtYW4gZXQgYWwuLCAyMDE3KSIpCmBgYAoKIyMjIFdoaWNoIGNhcGFjaXRpZXMgYXJlIGF0dHJpYnV0ZWQgdG8gd2hpY2ggdGFyZ2V0cz8KCmBgYHtyLCBmaWcud2lkdGggPSA2LCBmaWcuYXNwID0gMC44fQpzY29yZXNwbG90X2Z1bihlZmFfYWxsX2ssIHRhcmdldCA9ICJhbGwiKSArIAogIGxhYnModGl0bGUgPSAiUHJlc2V0IGNyaXRlcmlhIChXZWlzbWFuIGV0IGFsLiwgMjAxNykiKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSAzLCBmaWcuYXNwID0gMS41fQpzY29yZXNwbG90X2Z1bihlZmFfYWxsX2ssIHRhcmdldCA9IGMoImdob3N0cyIsICJHb2QiLCAiY2hpbGRyZW4iKSkgKyAKICBsYWJzKHRpdGxlID0gIlByZXNldCBjcml0ZXJpYSAoV2Vpc21hbiBldCBhbC4sIDIwMTcpIikKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gNSwgZmlnLmFzcCA9IDF9Cml0ZW1zcGxvdF9mdW4oZWZhX2FsbF9rLCB0YXJnZXQgPSBjKCJnaG9zdHMiLCAiR29kIiwgImNoaWxkcmVuIikpICsgCiAgbGFicyh0aXRsZSA9ICJQcmVzZXQgY3JpdGVyaWEgKFdlaXNtYW4gZXQgYWwuLCAyMDE3KSIpCmBgYAoKCgoKIyBDb21wYXJpbmcgY29uY2VwdHVhbCBzdHJ1Y3R1cmVzCgpXZSdsbCBleHRyYWN0IDQgZmFjdG9ycyBmcm9tIGFsbCBzYW1wbGVzLCB0byBrZWVwIHRoaW5ncyBzaW1wbGUuCgpgYGB7cn0KZWZhX3VzX2FkXzQgPC0gZmEoZF91c19hZF9waWxvdCwgbmZhY3RvcnMgPSA0LCByb3RhdGUgPSAib2JsaW1pbiIpCmVmYV9naF9jaF80IDwtIGZhKGRfZ2hfY2gsIG5mYWN0b3JzID0gNCwgcm90YXRlID0gIm9ibGltaW4iKQplZmFfdGhfYWRfNCA8LSBmYShkX3RoX2FkLCBuZmFjdG9ycyA9IDQsIHJvdGF0ZSA9ICJvYmxpbWluIikKZWZhX3RoX2NoXzQgPC0gZmEoZF90aF9jaCwgbmZhY3RvcnMgPSA0LCByb3RhdGUgPSAib2JsaW1pbiIpCmVmYV92dF9hZF80IDwtIGZhKGRfdnRfYWQsIG5mYWN0b3JzID0gNCwgcm90YXRlID0gIm9ibGltaW4iKQplZmFfdnRfY2hfNCA8LSBmYShkX3Z0X2NoLCBuZmFjdG9ycyA9IDQsIHJvdGF0ZSA9ICJvYmxpbWluIikKYGBgCgpgYGB7cn0KcGxvdF91c19hZF80IDwtIGhlYXRtYXBfZnVuKGVmYV91c19hZF80KSArIAogIGd1aWRlcyhmaWxsID0gIm5vbmUiKSArIAogIGxhYnMoeCA9ICJVUzogYWR1bHRzIikgKwogIHRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDApKQoKcGxvdF9naF9jaF80IDwtIGhlYXRtYXBfZnVuKGVmYV9naF9jaF80KSArIAogIGd1aWRlcyhmaWxsID0gIm5vbmUiKSArIAogIGxhYnMoeCA9ICJHaGFuYTogY2hpbGRyZW4iKSArCiAgdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMCkpCgpwbG90X3RoX2FkXzQgPC0gaGVhdG1hcF9mdW4oZWZhX3RoX2FkXzQpICsgCiAgZ3VpZGVzKGZpbGwgPSAibm9uZSIpICsgCiAgbGFicyh4ID0gIlRoYWlsYW5kOiBhZHVsdHMiKSArCiAgdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMCkpCgpwbG90X3RoX2NoXzQgPC0gaGVhdG1hcF9mdW4oZWZhX3RoX2NoXzQpICsgCiAgZ3VpZGVzKGZpbGwgPSAibm9uZSIpICsgCiAgbGFicyh4ID0gIlRoYWlsYW5kOiBjaGlsZHJlbiIpICsKICB0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwKSkKCnBsb3RfdnRfYWRfNCA8LSBoZWF0bWFwX2Z1bihlZmFfdnRfYWRfNCkgKyAKICBndWlkZXMoZmlsbCA9ICJub25lIikgKyAKICBsYWJzKHggPSAiVmFudWF0dTogYWR1bHRzIikgKwogIHRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDApKQoKcGxvdF92dF9jaF80IDwtIGhlYXRtYXBfZnVuKGVmYV92dF9jaF80KSArIAogIGd1aWRlcyhmaWxsID0gIm5vbmUiKSArIAogIGxhYnMoeCA9ICJWYW51YXR1OiBjaGlsZHJlbiIpICsKICB0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwKSkKYGBgCgpgYGB7ciwgZmlnLmFzcCA9IDEuNX0KcGxvdF9ncmlkKHBsb3RfdXNfYWRfNCwgcGxvdF9naF9jaF80LCBwbG90X3RoX2FkXzQsIAogICAgICAgICAgcGxvdF90aF9jaF80LCBwbG90X3Z0X2FkXzQsIHBsb3RfdnRfY2hfNCwgCiAgICAgICAgICBuY29sID0gMiwgbGFiZWxzID0gYygiQSIsICJCIiwgIkMiLCAiRCIsICJFIiwgIkYiKSkKYGBgCgo=